// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package fmt

import "errors"

// error根据格式说明符设置格式，并将字符串作为满足错误的
// 值返回。
// 
// 如果格式说明符包含带有错误操作数的%w谓词，
// 返回的错误将实现一个返回操作数的展开方法。
// 包含多个%w动词或为其提供不实现错误接口的操作数
// 无效。%w动词是
// 是%v的同义词。
func Errorf(format string, a ...any) error {
	p := newPrinter()
	p.wrapErrs = true
	p.doPrintf(format, a)
	s := string(p.buf)
	var err error
	if p.wrappedErr == nil {
		err = errors.New(s)
	} else {
		err = &wrapError{s, p.wrappedErr}
	}
	p.free()
	return err
}

type wrapError struct {
	msg string
	err error
}

func (e *wrapError) Error() string {
	return e.msg
}

func (e *wrapError) Unwrap() error {
	return e.err
}
